TypeScriptμ μ νν νμ μ μ¬μ©νμ¬ μ격ν κ°μ²΄ λͺ¨μ μΌμΉλ₯Ό ꡬννκ³ μμμΉ λͺ»ν μμ±μ λ°©μ§νμ¬ μ½λ κ²¬κ³ μ±μ ν보νμΈμ. μ€μ μ μ© μ¬λ‘μ λͺ¨λ² μ¬λ‘λ₯Ό μμ보μΈμ.
TypeScriptμ μ νν νμ : κ²¬κ³ ν μ½λλ₯Ό μν μ격ν κ°μ²΄ λͺ¨μ μΌμΉ
JavaScriptμ μμ μ§ν©μΈ TypeScriptλ λμ μΈ μΉ κ°λ° μΈκ³μ μ μ νμ΄νμ λμ ν©λλ€. TypeScriptλ νμ μμ μ±κ³Ό μ½λ μ μ§ κ΄λ¦¬ μΈ‘λ©΄μμ μλΉν μ΄μ μ μ 곡νμ§λ§, ꡬ쑰μ νμ΄ν μμ€ν μ λλλ‘ μμμΉ λͺ»ν λμμ μ λ°ν μ μμ΅λλ€. μ¬κΈ°μ "μ νν νμ "μ΄λΌλ κ°λ μ΄ λ±μ₯ν©λλ€. TypeScriptμλ λͺ μμ μΌλ‘ "μ νν νμ "μ΄λΌκ³ λͺ λͺ λ λ΄μ₯ κΈ°λ₯μ μμ§λ§, TypeScript κΈ°λ₯κ³Ό κΈ°μ μ μ‘°ν©μ ν΅ν΄ μ μ¬ν λμμ λ¬μ±ν μ μμ΅λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμμλ TypeScriptμμ λ μ격ν κ°μ²΄ λͺ¨μ μΌμΉλ₯Ό κ°μ νμ¬ μ½λ κ²¬κ³ μ±μ κ°μ νκ³ μΌλ°μ μΈ μ€λ₯λ₯Ό λ°©μ§νλ λ°©λ²μ λν΄ μμΈν μμλ³΄κ² μ΅λλ€.
TypeScriptμ ꡬ쑰μ νμ΄ν μ΄ν΄
TypeScriptλ ꡬ쑰μ νμ΄ν(λ νμ΄νμ΄λΌκ³ λ ν¨)μ μ¬μ©νλ©°, μ΄λ νμ νΈνμ±μ΄ μ μΈλ μ΄λ¦λ³΄λ€λ νμ μ λ©€λ²μ μν΄ κ²°μ λλ€λ κ²μ μλ―Έν©λλ€. κ°μ²΄κ° νμ μ νμν λͺ¨λ μμ±μ κ°μ§κ³ μλ€λ©΄, μΆκ° μμ±μ΄ μλμ§ μ¬λΆμ κ΄κ³μμ΄ ν΄λΉ νμ κ³Ό νΈνλλ κ²μΌλ‘ κ°μ£Όλ©λλ€.
μλ₯Ό λ€μ΄:
interface Point {
x: number;
y: number;
}
const myPoint = { x: 10, y: 20, z: 30 };
function printPoint(point: Point) {
console.log(`X: ${point.x}, Y: ${point.y}`);
}
printPoint(myPoint); // myPointμ 'z' μμ±μ΄ μλλΌλ μ μμ μΌλ‘ μλν©λλ€.
μ΄ μλ리μ€μμ TypeScriptλ `myPoint`μ μΆκ° `z` μμ±μ΄ μλλΌλ νμν `x` λ° `y` μμ±μ ν¬ν¨νκ³ μκΈ° λλ¬Έμ `printPoint`μ `myPoint`λ₯Ό μ λ¬νλ κ²μ νμ©ν©λλ€. μ΄ μ μ°μ±μ΄ νΈλ¦¬ν μ μμ§λ§, μμμΉ λͺ»ν μμ±μ΄ μλ κ°μ²΄λ₯Ό μ€μλ‘ μ λ¬νλ κ²½μ° λ―Έλ¬ν λ²κ·Έλ₯Ό μ λ°ν μλ μμ΅λλ€.
κ³Όλν μμ±μ λ¬Έμ
ꡬ쑰μ νμ΄νμ κ΄λν¨μ λλλ‘ μ€λ₯λ₯Ό μ¨κΈΈ μ μμ΅λλ€. κ΅¬μ± κ°μ²΄λ₯Ό μμνλ ν¨μλ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
interface Config {
apiUrl: string;
timeout: number;
}
function setup(config: Config) {
console.log(`API URL: ${config.apiUrl}`);
console.log(`Timeout: ${config.timeout}`);
}
const myConfig = { apiUrl: "https://api.example.com", timeout: 5000, typo: true };
setup(myConfig); // TypeScriptλ μ¬κΈ°μ λΆννμ§ μμ΅λλ€!
console.log(myConfig.typo); // trueλ₯Ό μΆλ ₯ν©λλ€. μΆκ° μμ±μ΄ μ‘°μ©ν μ‘΄μ¬ν©λλ€.
μ΄ μμμ `myConfig`μλ `typo`λΌλ μΆκ° μμ±μ΄ μμ΅λλ€. `myConfig`κ° `Config` μΈν°νμ΄μ€λ₯Ό κ³μ λ§μ‘±νκΈ° λλ¬Έμ TypeScriptλ μ€λ₯λ₯Ό λ°μμν€μ§ μμ΅λλ€. κ·Έλ¬λ μ€νλ μ ν κ°μ§λμ§ μμΌλ©°, μ€νκ° `typoo`λ₯Ό μλνλ€λ©΄ μ ν리μΌμ΄μ μ΄ μμλλ‘ μλνμ§ μμ μ μμ΅λλ€. μ€μ²©λ κ°μ²΄λ₯Ό λ€λ£° λ μ΄λ¬ν μ¬μν΄ λ³΄μ΄λ λ¬Έμ λ μ¬μν λ²κ·Έλ‘ μ»€μ§ μ μμ΅λλ€. νΉν μ€μ²©λ κ°μ²΄λ₯Ό λ€λ£° λ λλ½λκ±°λ μλͺ» μ λ ₯λ μμ±μ κ°μ§νκΈ° μ΄λ ΅μ΅λλ€.
TypeScriptμμ μ νν νμ κ°μ μ μ© λ°©λ²
TypeScriptμ μ§μ "μ νν νμ "μ΄ μ 곡λμ§λ μμ§λ§, μ μ¬ν κ²°κ³Όλ₯Ό μ»κ³ λ μ격ν κ°μ²΄ λͺ¨μ μΌμΉλ₯Ό κ°μ νκΈ° μν λͺ κ°μ§ κΈ°μ μ΄ μμ΅λλ€.
1. `Omit`μ μ¬μ©ν νμ λ¨μΈ
`Omit` μ νΈλ¦¬ν° νμ μ κΈ°μ‘΄ νμ μμ νΉμ μμ±μ μ μΈνμ¬ μ νμ μ λ§λ€ μ μκ² ν΄μ€λλ€. νμ λ¨μΈκ³Ό ν¨κ» μ¬μ©νλ©΄ κ³Όλν μμ±μ λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
interface Point {
x: number;
y: number;
}
const myPoint = { x: 10, y: 20, z: 30 };
// Pointμ μμ±λ§ ν¬ν¨νλ νμ
μμ±
const exactPoint: Point = myPoint as Omit & Point;
// μ€λ₯: νμ
'{ x: number; y: number; z: number; }'μ(λ) νμ
'Point'μ ν λΉν μ μμ΅λλ€.
// κ°μ²΄ 리ν°λ΄μ μλ €μ§ μμ±λ§ μ§μ ν μ μμΌλ©° 'z'λ νμ
'Point'μ μ‘΄μ¬νμ§ μμ΅λλ€.
function printPoint(point: Point) {
console.log(`X: ${point.x}, Y: ${point.y}`);
}
// μμ
const myPointCorrect = { x: 10, y: 20 };
const exactPointCorrect: Point = myPointCorrect as Omit & Point;
printPoint(exactPointCorrect);
μ΄ μ κ·Ό λ°©μμ `myPoint`μ `Point` μΈν°νμ΄μ€μ μ μλμ§ μμ μμ±μ΄ μλ κ²½μ° μ€λ₯λ₯Ό λ°μμν΅λλ€.
μ€λͺ
: `Omit
2. κ°μ²΄ μμ±μ μν ν¨μ μ¬μ©
μΈν°νμ΄μ€μ μ μλ μμ±λ§ νμ©νλ ν©ν 리 ν¨μλ₯Ό λ§λ€ μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ κ°μ²΄ μμ± μμ μ κ°λ ₯ν νμ κ²μ¬λ₯Ό μ 곡ν©λλ€.
interface Config {
apiUrl: string;
timeout: number;
}
function createConfig(config: Config): Config {
return {
apiUrl: config.apiUrl,
timeout: config.timeout,
};
}
const myConfig = createConfig({ apiUrl: "https://api.example.com", timeout: 5000 });
//μ»΄νμΌλμ§ μμ΅λλ€:
//const myConfigError = createConfig({ apiUrl: "https://api.example.com", timeout: 5000, typo: true });
// νμ
'{ apiUrl: string; timeout: number; typo: true; }'μ μΈμλ νμ
'Config'μ λ§€κ°λ³μμ ν λΉν μ μμ΅λλ€.
// κ°μ²΄ 리ν°λ΄μ μλ €μ§ μμ±λ§ μ§μ ν μ μμΌλ©° 'typo'λ νμ
'Config'μ μ‘΄μ¬νμ§ μμ΅λλ€.
`Config` μΈν°νμ΄μ€μ μ μλ μμ±λ§μΌλ‘ ꡬμ±λ κ°μ²΄λ₯Ό λ°νν¨μΌλ‘μ¨ μΆκ° μμ±μ΄ λΌμ΄λ€μ§ μλλ‘ ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ ꡬμ±μ λ μμ νκ² μμ±ν μ μμ΅λλ€.
3. νμ κ°λ μ¬μ©
νμ κ°λλ νΉμ λ²μ λ΄μμ λ³μμ νμ μ μ’νλ ν¨μμ λλ€. μ§μ μ μΌλ‘ κ³Όλν μμ±μ λ°©μ§νμ§λ μμ§λ§, λͺ μμ μΌλ‘ νμΈνκ³ μ μ ν μ‘°μΉλ₯Ό μ·¨νλ λ° λμμ΄ λ μ μμ΅λλ€.
interface User {
id: number;
name: string;
}
function isUser(obj: any): obj is User {
return (
typeof obj === 'object' &&
obj !== null &&
'id' in obj && typeof obj.id === 'number' &&
'name' in obj && typeof obj.name === 'string' &&
Object.keys(obj).length === 2 // ν€ κ°μ νμΈ. μ°Έκ³ : μ·¨μ½νλ©° Userμ μ νν ν€ κ°μμ λ°λΌ λ¬λΌμ§λλ€.
);
}
const potentialUser1 = { id: 123, name: "Alice" };
const potentialUser2 = { id: 456, name: "Bob", extra: true };
if (isUser(potentialUser1)) {
console.log("μ ν¨ν μ¬μ©μ:", potentialUser1.name);
} else {
console.log("μ ν¨νμ§ μμ μ¬μ©μ");
}
if (isUser(potentialUser2)) {
console.log("μ ν¨ν μ¬μ©μ:", potentialUser2.name); // μ¬κΈ°μ λλ¬νμ§ μμ΅λλ€.
} else {
console.log("μ ν¨νμ§ μμ μ¬μ©μ");
}
μ΄ μμμ `isUser` νμ κ°λλ νμ μμ±μ μ‘΄μ¬λΏλ§ μλλΌ ν΄λΉ νμ λ° μμ±μ *μ νν* κ°μλ νμΈν©λλ€. μ΄ μ κ·Ό λ°©μμ λ λͺ μμ μ΄λ©° μ ν¨νμ§ μμ κ°μ²΄λ₯Ό μ μ νκ² μ²λ¦¬ν μ μμ΅λλ€. κ·Έλ¬λ μμ± κ°μ νμΈμ μ·¨μ½ν©λλ€. `User`μ μμ±μ΄ μΆκ°/μμ λ λλ§λ€ νμΈμ μ λ°μ΄νΈν΄μΌ ν©λλ€.
4. `Readonly` λ° `as const` νμ©
`Readonly`λ κΈ°μ‘΄ μμ±μ μμ μ λ°©μ§νκ³ , `as const`λ λͺ¨λ μμ±μ΄ κΉμ΄ μ½κΈ° μ μ©μ΄λ©° 리ν°λ΄ νμ μ κ°λ μ½κΈ° μ μ© νν λλ κ°μ²΄λ₯Ό μμ±νλ λ°λ©΄, λ€λ₯Έ λ°©λ²κ³Ό κ²°ν©νμ¬ λ μ격ν μ μ λ° νμ κ²μ¬λ₯Ό λ§λλ λ° μ¬μ©ν μ μμ΅λλ€. νμ§λ§ λ μ€ μ΄λ κ²λ λ¨λ μΌλ‘λ κ³Όλν μμ±μ λ°©μ§νμ§ λͺ»ν©λλ€.
interface Options {
width: number;
height: number;
}
// Readonly νμ
μμ±
type ReadonlyOptions = Readonly;
const options: ReadonlyOptions = { width: 100, height: 200 };
//options.width = 300; // μ€λ₯: μ½κΈ° μ μ© μμ±μ΄λ―λ‘ 'width'μ ν λΉν μ μμ΅λλ€.
// as const μ¬μ©
const config = { api_url: "https://example.com", timeout: 3000 } as const;
//config.timeout = 5000; // μ€λ₯: μ½κΈ° μ μ© μμ±μ΄λ―λ‘ 'timeout'μ ν λΉν μ μμ΅λλ€.
//νμ§λ§ κ³Όλν μμ±μ μ¬μ ν νμ©λ©λλ€:
const invalidOptions: ReadonlyOptions = { width: 100, height: 200, depth: 300 }; //μ€λ₯ μμ. μ¬μ ν κ³Όλν μμ±μ νμ©ν©λλ€.
interface StrictOptions {
readonly width: number;
readonly height: number;
}
//μ΄μ μ€λ₯κ° λ°μν©λλ€:
//const invalidStrictOptions: StrictOptions = { width: 100, height: 200, depth: 300 };
// νμ
'{ width: number; height: number; depth: number; }'μ(λ) νμ
'StrictOptions'μ ν λΉν μ μμ΅λλ€.
// κ°μ²΄ 리ν°λ΄μ μλ €μ§ μμ±λ§ μ§μ ν μ μμΌλ©° 'depth'λ νμ
'StrictOptions'μ μ‘΄μ¬νμ§ μμ΅λλ€.
μ΄λ λΆλ³μ±μ ν₯μμν€μ§λ§, λ³μ±μ λ°©μ§ν λΏ μΆκ° μμ±μ μ‘΄μ¬λ₯Ό λ°©μ§νμ§λ μμ΅λλ€. `Omit` λλ ν¨μ μ κ·Ό λ°©μκ³Ό κ²°ν©νλ©΄ λ ν¨κ³Όμ μ λλ€.
5. λΌμ΄λΈλ¬λ¦¬ μ¬μ© (μ: Zod, io-ts)
Zod λ° io-tsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ κ°λ ₯ν λ°νμ νμ κ²μ¦ λ° μ€ν€λ§ μ μ κΈ°λ₯μ μ 곡ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ κ³Όλν μμ±μ λ°©μ§νλ κ²μ ν¬ν¨νμ¬ λ°μ΄ν°μ μμ λͺ¨μμ μ ννκ² μ€λͺ νλ μ€ν€λ§λ₯Ό μ μν μ μμ΅λλ€. λ°νμ μ’ μμ±μ μΆκ°νμ§λ§ λ§€μ° κ²¬κ³ νκ³ μ μ°ν μ루μ μ μ 곡ν©λλ€.
Zod μμ:
import { z } from 'zod';
const UserSchema = z.object({
id: z.number(),
name: z.string(),
});
type User = z.infer;
const validUser = { id: 1, name: "John" };
const invalidUser = { id: 2, name: "Jane", extra: true };
const parsedValidUser = UserSchema.parse(validUser);
console.log("νμ±λ μ ν¨ν μ¬μ©μ:", parsedValidUser);
try {
const parsedInvalidUser = UserSchema.parse(invalidUser);
console.log("νμ±λ μ ν¨νμ§ μμ μ¬μ©μ:", parsedInvalidUser); // μ¬κΈ°μ λλ¬νμ§ μμ΅λλ€.
} catch (error) {
console.error("μ ν¨μ± κ²μ¬ μ€λ₯:", error.errors);
}
Zodμ `parse` λ©μλλ μ λ ₯μ΄ μ€ν€λ§λ₯Ό μ€μνμ§ μμΌλ©΄ μ€λ₯λ₯Ό λ°μμμΌ ν¨κ³Όμ μΌλ‘ κ³Όλν μμ±μ λ°©μ§ν©λλ€. μ΄λ λ°νμ μ ν¨μ±μ μ 곡νκ³ μ€ν€λ§μμ TypeScript νμ μ μμ±νμ¬ νμ μ μμ λ°νμ μ ν¨μ± κ²μ¬ λ‘μ§ κ°μ μΌκ΄μ±μ 보μ₯ν©λλ€.
μ νν νμ κ°μ λ₯Ό μν λͺ¨λ² μ¬λ‘
TypeScriptμμ λ μ격ν κ°μ²΄ λͺ¨μ μΌμΉλ₯Ό κ°μ ν λ κ³ λ €ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
- μ¬λ°λ₯Έ κΈ°μ μ ν: μ΅μμ μ κ·Ό λ°©μμ νΉμ μꡬ μ¬νκ³Ό νλ‘μ νΈ μꡬ μ¬νμ λ°λΌ λ¬λΌμ§λλ€. κ°λ¨ν κ²½μ°μλ `Omit` λλ ν©ν 리 ν¨μλ₯Ό μ¬μ©ν νμ λ¨μΈμΌλ‘ μΆ©λΆν μ μμ΅λλ€. λ 볡μ‘ν μλλ¦¬μ€ λλ λ°νμ μ ν¨μ± κ²μ¬κ° νμν κ²½μ° Zod λλ io-tsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμμμ€.
- μΌκ΄μ± μ μ§: μ νν μ κ·Ό λ°©μμ μ½λλ² μ΄μ€ μ 체μ μΌκ΄λκ² μ μ©νμ¬ ν΅μΌλ μμ€μ νμ μμ μ±μ μ μ§νμμμ€.
- νμ λ¬Έμν: μμλλ λ°μ΄ν° λͺ¨μμ λ€λ₯Έ κ°λ°μμκ² μ λ¬νκΈ° μν΄ μΈν°νμ΄μ€μ νμ μ λͺ ννκ² λ¬Έμννμμμ€.
- μ½λ ν μ€νΈ: νμ μ μ½ μ‘°κ±΄μ΄ μμλλ‘ μλνκ³ μ½λκ° μ ν¨νμ§ μμ λ°μ΄ν°λ₯Ό μ μ νκ² μ²λ¦¬νλμ§ νμΈνλ λ¨μ ν μ€νΈλ₯Ό μμ±νμμμ€.
- μ μΆ©μ κ³ λ €: λ μ격ν κ°μ²΄ λͺ¨μ μΌμΉλ₯Ό κ°μ νλ©΄ μ½λμ κ²¬κ³ μ±μ΄ ν₯μλ μ μμ§λ§ κ°λ° μκ°μ΄ λμ΄λ μλ μμ΅λλ€. μ΄μ κ³Ό λΉμ©μ λΉκ΅νκ³ νλ‘μ νΈμ κ°μ₯ μ ν©ν μ κ·Ό λ°©μμ μ ννμμμ€.
- μ μ§μ μ±ν: λκ·λͺ¨ κΈ°μ‘΄ μ½λλ² μ΄μ€μμ μμ νλ κ²½μ° κ°μ₯ μ€μν λΆλΆλΆν° μμνμ¬ μ΄λ¬ν κΈ°μ μ μ μ§μ μΌλ‘ μ±ννλ κ²μ κ³ λ €νμμμ€.
- κ°μ²΄ λͺ¨μ μ μ μ νμ λ³μΉλ³΄λ€ μΈν°νμ΄μ€ μ νΈ: μΈν°νμ΄μ€λ μ μΈ λ³ν©μ μ§μνλ―λ‘ μΌλ°μ μΌλ‘ λ€λ₯Έ νμΌμμ νμ μ νμ₯νλ λ° μ μ©νκΈ° λλ¬Έμ μ νΈλ©λλ€.
μ€μ μ¬λ‘
μ νν νμ μ΄ μ μ©ν μ μλ μ€μ μλ리μ€λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
- API μμ² νμ΄λ‘λ: APIλ‘ λ°μ΄ν°λ₯Ό λ³΄λΌ λ νμ΄λ‘λκ° μμ μ€ν€λ§λ₯Ό μ€μνλλ‘ νλ κ²μ΄ μ€μν©λλ€. μ νν νμ μ κ°μ νλ©΄ μμμΉ λͺ»ν μμ±μ 보λ΄μ λ°μνλ μ€λ₯λ₯Ό λ°©μ§ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λ§μ κ²°μ μ²λ¦¬ APIλ μμμΉ λͺ»ν λ°μ΄ν°μ λ§€μ° λ―Όκ°ν©λλ€.
- κ΅¬μ± νμΌ: κ΅¬μ± νμΌμλ μ’ μ’ λ§μ μμ±μ΄ ν¬ν¨λλ©° μ€νκ° λ°μνκΈ° μ½μ΅λλ€. μ νν νμ μ μ¬μ©νλ©΄ μ΄λ¬ν μ€νλ₯Ό μ‘°κΈ°μ κ°μ§νλ λ° λμμ΄ λ μ μμ΅λλ€. ν΄λΌμ°λ λ°°ν¬μμ μλ² μμΉλ₯Ό μ€μ νλ κ²½μ° μμΉ μ€μ μ μ€ν (μ: eu-west-1 λ eu-wet-1)λ μ¬μ μ κ°μ§λμ§ μμΌλ©΄ λλ²κΉ νκΈ°κ° λ§€μ° μ΄λ €μμ§λλ€.
- λ°μ΄ν° λ³ν νμ΄νλΌμΈ: ν νμμμ λ€λ₯Έ νμμΌλ‘ λ°μ΄ν°λ₯Ό λ³νν λ μΆλ ₯ λ°μ΄ν°κ° μμ μ€ν€λ§λ₯Ό μ€μνλλ‘ νλ κ²μ΄ μ€μν©λλ€.
- λ©μμ§ ν: λ©μμ§ νλ₯Ό ν΅ν΄ λ©μμ§λ₯Ό λ³΄λΌ λ λ©μμ§ νμ΄λ‘λκ° μ ν¨νκ³ μ¬λ°λ₯Έ μμ±μ ν¬ν¨νλλ‘ νλ κ²μ΄ μ€μν©λλ€.
μ: κ΅μ ν (i18n) ꡬμ±
λ€κ΅μ΄ μ ν리μΌμ΄μ μ λ²μμ κ΄λ¦¬νλ€κ³ μμν΄ λ³΄μΈμ. λ€μκ³Ό κ°μ κ΅¬μ± κ°μ²΄κ° μμ μ μμ΅λλ€.
interface Translation {
greeting: string;
farewell: string;
}
interface I18nConfig {
locale: string;
translations: Translation;
}
const englishConfig: I18nConfig = {
locale: "en-US",
translations: {
greeting: "Hello",
farewell: "Goodbye"
}
};
// κ³Όλν μμ±μ΄ μ‘΄μ¬νμ¬ μ‘°μ©ν λ²κ·Έλ₯Ό λμ
νλ―λ‘ λ¬Έμ κ° λ©λλ€.
const spanishConfig: I18nConfig = {
locale: "es-ES",
translations: {
greeting: "Hola",
farewell: "AdiΓ³s",
typo: "unintentional translation"
}
};
// μ루μ
: Omit μ¬μ©
const spanishConfigCorrect: I18nConfig = {
locale: "es-ES",
translations: {
greeting: "Hola",
farewell: "AdiΓ³s"
} as Omit & Translation
};
μ νν νμ μ΄ μμΌλ©΄ λ²μ ν€μ μ€ν (μ: `typo` νλ μΆκ°)λ λμΉμ±μ§ λͺ»νκ³ μ¬μ©μ μΈν°νμ΄μ€μμ λ²μ λλ½μ μ λ°ν μ μμ΅λλ€. λ μ격ν κ°μ²΄ λͺ¨μ μΌμΉλ₯Ό κ°μ ν¨μΌλ‘μ¨ μ΄λ¬ν μ€λ₯λ₯Ό κ°λ° μ€μ κ°μ§νκ³ νλ‘λμ μ λλ¬νλ κ²μ λ°©μ§ν μ μμ΅λλ€.
κ²°λ‘
TypeScriptμλ λ΄μ₯ "μ νν νμ "μ΄ μμ§λ§, `Omit`μ μ¬μ©ν νμ λ¨μΈ, ν©ν 리 ν¨μ, νμ κ°λ, `Readonly`, `as const` λ° Zod λ° io-tsμ κ°μ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ κ°μ TypeScript κΈ°λ₯κ³Ό κΈ°μ μ μ‘°ν©νμ¬ μ μ¬ν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. λ μ격ν κ°μ²΄ λͺ¨μ μΌμΉλ₯Ό κ°μ ν¨μΌλ‘μ¨ μ½λμ κ²¬κ³ μ±μ κ°μ νκ³ μΌλ°μ μΈ μ€λ₯λ₯Ό λ°©μ§νλ©° μ ν리μΌμ΄μ μ λ μμ μ μΌλ‘ λ§λ€ μ μμ΅λλ€. μꡬ μ¬νμ κ°μ₯ μ ν©ν μ κ·Ό λ°©μμ μ ννκ³ μ½λλ² μ΄μ€ μ 체μ μΌκ΄λκ² μ μ©νλ κ²μ μμ§ λ§μμμ€. μ΄λ¬ν μ κ·Ό λ°©μμ μ μ€νκ² κ³ λ €νλ©΄ μ ν리μΌμ΄μ μ νμ μ λν λ ν° μ μ΄λ₯Ό μ»κ³ μ₯κΈ°μ μΈ μ μ§ κ΄λ¦¬μ±μ λμΌ μ μμ΅λλ€.